package com.shujia.custom.udf;

import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.lazy.LazyLong;
import org.apache.hadoop.hive.serde2.lazy.LazyString;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;

/*
    使用新版本的方式创建自定义UDF类
 */
public class UDFDemo3 extends GenericUDF {

    /*
        用户说明函数的返回值的
     */
    @Override
    public ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {
        //定义函数返回的类型
        return PrimitiveObjectInspectorFactory.javaStringObjectInspector;
    }

    /*
        将来自定义函数调用的功能，实际上就是evaluate()

        fzfun3(name)
        fzfun3(age)
     */
    @Override
    public Object evaluate(DeferredObject[] arguments) throws HiveException {
        //若是udf函数，传进入一个值的话，就被方法参数数组中第一个位置元素获取
        Object o = arguments[0].get();
        //通过测试发现：
        // hive表中的string类型对应LazyString类的对象
        // bigint类型对象LazyLong类的对象
        String res = null;
        if(o instanceof LazyString){
            LazyString o1 = (LazyString) o;
            String s = o1.getWritableObject().toString(); //获取hiveLazyString对象中封装的hadoop的数据类型，进而解析成java中的数据类型
            String s1 = s.substring(0, 1);
            String s2 = s.substring(1);
            s2 = s2.toLowerCase();
            res = "数加：" + s1 + s2;
        }else if(o instanceof LazyLong){
            LazyLong o1 = (LazyLong) o;
            long sal = o1.getWritableObject().get();
            res = "薪资：" + sal;
        }

        //hive中的数据类型在java中，新版本不是java基本数据类型表示，是由Hive自己内部的数据类型包装成类的对象
        //先将元素的类型返回，看看什么类型
        return res;
    }

    /*
        解释这个自定义函数
     */
    @Override
    public String getDisplayString(String[] children) {
        return "";
    }
}
